package pt.ipleiria.plp.ui;

import de.enough.polish.ui.Alert;
import de.enough.polish.ui.AlertType;
import de.enough.polish.ui.Command;
import de.enough.polish.ui.CommandListener;
import de.enough.polish.ui.Displayable;
import de.enough.polish.ui.List;
import de.enough.polish.util.Locale;

import javax.microedition.lcdui.Image;
import pt.ipleiria.plp.BlackSpotterMidlet;
import pt.ipleiria.plp.Lixeiras.LixeiraSent;
import pt.ipleiria.plp.threads.CallbackReturnPendentes;
import pt.ipleiria.plp.threads.GetLixeirasPendentes;

/**
 *
 * @author Ricardo
 */
public class MainMenuScreen extends List implements CommandListener,CallbackReturnPendentes {

    // O parâmetro key de Locale.get() tem que ser uma string literal e não uma variável
    // O parâmetro parameter, se necessário, tem que ser uma variável e não uma string ou conjunto de strings literais
    // Adicionar novos pares chave-valor em resources/messages_pt.txt
    //#style menuItem
    private Command cmdOK = new Command(Locale.get("cmd.OK"), Command.ITEM, 1);
    //#style menuItem
    private Command cmdExit = new Command(Locale.get("cmd.Sair"), Command.EXIT, 2);
    private BlackSpotterMidlet midlet;
    private OnHold hold;

    public MainMenuScreen(int listType, BlackSpotterMidlet midlet) {

        // Directivas style aplicam CSS styles definidos em polish.css e devem ser inseridas antes de:
        // - Chamadas a constructors de List/Form/Item, ou super() do constructor de uma classe que os extenda
        // - Chamadas de funções como setAppearanceMode(), append(), insert() ou set()
        // A classe UiAccess possui métodos estáticos que permitem manipular styles e elementos de UI programaticamente
        //#style mainScreen
        super(Locale.get("title.Main"), listType);
        this.midlet = midlet;
        this.setCommandListener(this);
        this.setSelectCommand(cmdOK);
        this.addCommand(cmdExit);
        //#style mainItem
        // O 2º parâmetro é uma imagem, que também pode ser definida no CSS (ver
        //classe CSS .mainItem em polish.css)
        this.append(Locale.get("title.NovaLixeira"), null);
        //#style mainItem
        this.append(Locale.get("title.MeusBlackSpots"), null);
        //#style mainItem
        this.append(Locale.get("title.LixeirasPendentes"), null);
        //#style mainItem
        this.append(Locale.get("title.PertoDeMim"), null);
        //#style mainItem
        this.append(Locale.get("title.Opcoes"), null);
    }

    public MainMenuScreen(String title, int listType, String[] stringElements, Image[] imageElements, BlackSpotterMidlet midlet) {
        super(title, listType, stringElements, imageElements);
        this.midlet = midlet;
        this.setCommandListener(this);
        this.setSelectCommand(cmdOK);
        this.addCommand(cmdExit);
    }

    public void commandAction(Command c, Displayable d) {
        if (c == cmdExit) {
            midlet.destroyApp(false);
        }
        if (c == cmdOK) {
            int selectedIndex = this.getSelectedIndex();
            // Chamar os próximos ecrãs com midlet.getDisplay().setCurrent();
            switch (selectedIndex) {
                case 0:
                    CriarEventoScreen create = new CriarEventoScreen(midlet);
                    midlet.getDisplay().setCurrent(create);
                    break;
                case 1:
                    MeusEventosScreen myEventsScreen = new MeusEventosScreen(Locale.get("title.MeusBlackSpots"), List.IMPLICIT, midlet);
                    midlet.getDisplay().setCurrent(myEventsScreen);
                    break;
                case 2:
                    GetLixeirasPendentes t = new GetLixeirasPendentes(midlet, this);
                    t.start();
                    break;
                case 3:
                    ProcurarEventosPertodeMimScreen procNear =
                            new ProcurarEventosPertodeMimScreen(midlet);
                    midlet.getDisplay().setCurrent(procNear);
                    break;
                case 4:
                    OpcoesScreen op = new OpcoesScreen(midlet);
                    midlet.getDisplay().setCurrent(op);
                    break;
                case 5:
                    
                    break;
                default:
                    break;
            }
        }
    }

    public void returnPendentes(LixeiraSent[] lixs, String beingEdited) {
        System.out.println("Recieved: "+lixs.length);
        if (lixs == null && beingEdited != null) {
            Alert alert = new Alert(Locale.get("title.Erro"),
                    Locale.get("mensagem.allBeingEdited"), null, AlertType.ERROR);
            midlet.getDisplay().setCurrent(alert, this);
        } else if (lixs == null) {
            Alert alert = new Alert(Locale.get("title.Erro"),
                    Locale.get("mensagem.nonNear"), null, AlertType.ERROR);
            midlet.getDisplay().setCurrent(alert, this);
        } else if (beingEdited == null) {

            Alert alert = new Alert(Locale.get("title.sucesso"),
                    Locale.get("mensagens.sucesso"), null, AlertType.INFO);
            RecievedEventosScreen evs = new RecievedEventosScreen(Locale.get("title.pend"),midlet, lixs);
            midlet.getDisplay().setCurrent(alert,evs);
        } else {
            Alert alert = new Alert(Locale.get("title.sucesso"),
                    Locale.get("mensagem.someBeingEdited") + "\n" + beingEdited, null, AlertType.INFO);
            RecievedEventosScreen evs = new RecievedEventosScreen(Locale.get("title.pend"),midlet, lixs);
            midlet.getDisplay().setCurrent(alert, evs);
        }
    }
}
